#include <stdio.h>
#include <pthread.h>
// #include <conio.h>

typedef void(*cb)(int pin, void *data);

struct _gpio{
    int enable;
    void *data;
    cb interrupt;
} __gpio[4];

int gpio_set_mode(int pin,int mode)
{
    printf("gpio set mode %d in %d\n",pin,mode);
    return 0;
}

int gpio_set_pull(int pin,int pull)
{
    printf("gpio set pull %d in %d\n",pin,pull);
    return 0;
}

void gpio_write(int pin,int val)
{
    printf("gpio wirte %d in %d\n",pin,val);
    // return 0;
}

int gpio_toggle(int pin){return 0;}

int gpio_read(int pin){return 0;}

int gpio_enable_int(int pin)
{
    if(pin < 0 || pin > 3)
        return 0;
    
    __gpio[pin].enable = 1;

    return 1;
}

int gpio_disable_int(int pin)
{
    if(pin < 0 || pin > 3)
        return 0;
    
    __gpio[pin].enable = 0;

    return 1;
}

int gpio_set_int_handler(int pin ,int mode,void(*cb)(int pin,void *data),void *data)
{
    if(pin < 0 || pin > 3)
        return 0;

    __gpio[pin].data = data;
    __gpio[pin].interrupt = cb;

    return 1;
}

int gpio_set_button_handler(int pin,int pull,int mode,int period,void(*cb)(int pin, void *data), void *data){return 0;}



static void *gpio(void *arg)
{
    while(1){
        int ch = getc(stdin);
        if(ch >= '1' && ch <= '4'){
            int io = ch - '1';
            if(__gpio[io].enable == 1){
                if(__gpio[io].interrupt)
                    __gpio[io].interrupt(io,__gpio[io].data);
            }
        }
    }

    return NULL;
}

void gpio_init(void)
{
    pthread_t thread;

    pthread_create(&thread,NULL,gpio,NULL);
}